package com.lxmes.flowable.service.impl;

import com.lxmes.business.domain.CcPurchaseInfoSp;
import com.lxmes.business.service.ICcPurchaseInfoSpService;
import com.lxmes.common.exception.ServiceException;
import com.lxmes.common.utils.DateUtils;
import com.lxmes.common.utils.NewNumber;
import com.lxmes.common.utils.SecurityUtils;
import com.lxmes.common.utils.StringUtils;
import com.lxmes.common.utils.bean.BeanUtils;
import com.lxmes.common.utils.bean.BeanValidators;
import com.lxmes.system.domain.SysSp;
import com.lxmes.system.domain.SysSpTask;
import com.lxmes.system.domain.SysSpTaskProcess;
import com.lxmes.system.mapper.SysSpMapper;
import com.lxmes.system.mapper.SysSpTaskMapper;
import com.lxmes.system.mapper.SysSpTaskProcessMapper;
import com.lxmes.system.service.ISysSpTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.Validator;
import java.util.Date;
import java.util.List;

/**
 * 审批任务Service业务层处理
 * 
 * @author zhangzhiyu
 * @date 2023-06-28
 */
@Service
public class SysSpTaskServiceImpl implements ISysSpTaskService
{
    @Autowired
    private SysSpTaskMapper sysSpTaskMapper;

    @Autowired
    protected Validator validator;

    @Autowired
    private SysSpMapper spMapper;
    @Autowired
    private SysSpTaskProcessMapper processMapper;
    @Autowired
    private ICcPurchaseInfoSpService purchaseInfoSpService;
    /**
     * 查询审批任务
     * 
     * @param id 审批任务主键
     * @return 审批任务
     */
    @Override
    public SysSpTask selectSysSpTaskById(Long id)
    {
        return sysSpTaskMapper.selectSysSpTaskById(id);
    }

    /**
     * 查询审批任务列表
     * 
     * @param sysSpTask 审批任务
     * @return 审批任务
     */
    @Override
    public List<SysSpTask> selectSysSpTaskList(SysSpTask sysSpTask)
    {
        sysSpTask.setUserId(SecurityUtils.getUserId());
        return sysSpTaskMapper.selectSysSpTaskList(sysSpTask);
    }

    /**
     * 新增审批任务
     * 
     * @param sysSpTask 审批任务
     * @return 结果
     */
    @Override
    public int insertSysSpTask(SysSpTask sysSpTask)
    {
        sysSpTask.setCreateTime(DateUtils.getNowDate());
        return sysSpTaskMapper.insertSysSpTask(sysSpTask);
    }
    /*发起审批*/
    @Override
    public int addSpTask(String spCode,String danhao) {
        SysSp sp =new SysSp();
        SysSpTask sysSpTask =new SysSpTask();
        //初始节点0
        Long sort=0L;
        //1、查看发起的当前用户有审批权限么，有的话直接进入下个审批
        SysSp spUser = spMapper.selectSpUser(SecurityUtils.getUserId().toString(), spCode,SecurityUtils.getFactoryCode());
        if(spUser!=null){
            sort=spUser.getSpSort();
        }
        //查看谁是最后审批人
        SysSp spEnd = spMapper.selectSpEndUser(spCode,SecurityUtils.getFactoryCode());
        if(sort.longValue()==spEnd.getSpSort().longValue()){
            sp =  spEnd;
        }else {
            //2、下一级审批
            sp = spMapper.selectSysSpUp(sort.toString(), spCode,SecurityUtils.getFactoryCode());
        }
        if(sp!=null){
            sysSpTask.setFactoryCode(SecurityUtils.getFactoryCode());
            sysSpTask.setFactoryName(SecurityUtils.getFactoryName());
            sysSpTask.setDanhao(danhao);
            String number= "SP_"+ NewNumber.createNewNumber(sysSpTaskMapper.getNewCode(DateUtils.getDate()));
            sysSpTask.setTaskId(number);
            sysSpTask.setUserId(SecurityUtils.getUserId());
            sysSpTask.setUserName(SecurityUtils.getUsername());
            sysSpTask.setDeptId(SecurityUtils.getDeptId());
            sysSpTask.setSpUserId(sp.getSpUserId());
            sysSpTask.setSpUserName(sp.getSpUserName());
            sysSpTask.setSpCode(sp.getSpCode());
            sysSpTask.setSpName(sp.getSpName());
            sysSpTask.setSpSolt(sp.getSpSort().toString());
            sysSpTask.setSpFlag("0");
            sysSpTask.setIsSpwc("0");
            sysSpTask.setCreateTime(DateUtils.getNowDate());
        }else {
            throw new ServiceException(spCode+"未找到审批流程");
        }
        return sysSpTaskMapper.insertSysSpTask(sysSpTask);
    }

    @Override
    @Transactional
    public int spSubTask(SysSpTask sysSpTask) {
        SysSpTask hxyw=new SysSpTask();
        BeanUtils.copyProperties(sysSpTask,hxyw);
        SysSpTaskProcess taskProcess=new SysSpTaskProcess();
        taskProcess.setFactoryCode(SecurityUtils.getFactoryCode());
        taskProcess.setFactoryName(SecurityUtils.getFactoryName());
        BeanUtils.copyProperties(sysSpTask,taskProcess);
        taskProcess.setRemark(sysSpTask.getSpUserName());
        processMapper.insertSysSpTaskProcess(taskProcess);
        if("1".equals(sysSpTask.getSpFlag())){
            //2、查看是否有下一级审批
            SysSp sp = spMapper.selectSysSpUp(sysSpTask.getSpSolt(), sysSpTask.getSpCode(),SecurityUtils.getFactoryCode());
            if(sp!=null){
                sysSpTask.setSpUserId(sp.getSpUserId());
                sysSpTask.setSpUserName(sp.getSpUserName());
                sysSpTask.setSpSolt(sp.getSpSort().toString());
                hxyw.setIsSpwc("2");
            }else {
                sysSpTask.setIsSpwc("1");
                hxyw.setIsSpwc("1");
            }
        }else {
            sysSpTask.setIsSpwc("1");
            hxyw.setIsSpwc("1");
        }
        sysSpTask.setUpdateTime(DateUtils.getNowDate());
        sysSpTask.setCreateBy(SecurityUtils.getUsername());
        //回写业务
        this.ywhx(hxyw);
        sysSpTaskMapper.updateSysSpTask(sysSpTask);

        return 1;
    }
    //采购回写
    public void ywhx(SysSpTask sysSpTask){
        //if("SPCG001".equals(sysSpTask.getSpCode())){}
            CcPurchaseInfoSp sp=new CcPurchaseInfoSp();
            sp.setDanhao(sysSpTask.getDanhao());
            List<CcPurchaseInfoSp> list = purchaseInfoSpService.selectCcPurchaseInfoSpList(sp);
            for(CcPurchaseInfoSp infoSp:list){
                infoSp.setShenhName(sysSpTask.getSpUserName());
                infoSp.setShenhFlag(sysSpTask.getSpFlag());
                infoSp.setShenhRemark(sysSpTask.getSpRemark());
                infoSp.setShenhTime(new Date());
                infoSp.setShenhState(sysSpTask.getIsSpwc());
                purchaseInfoSpService.updateCcPurchaseInfoSp(infoSp);
            }
    }

    /**
     * 修改审批任务
     * 
     * @param sysSpTask 审批任务
     * @return 结果
     */
    @Override
    public int updateSysSpTask(SysSpTask sysSpTask)
    {
        sysSpTask.setUpdateTime(DateUtils.getNowDate());
        return sysSpTaskMapper.updateSysSpTask(sysSpTask);
    }

    /**
     * 批量删除审批任务
     * 
     * @param ids 需要删除的审批任务主键
     * @return 结果
     */
    @Override
    public int deleteSysSpTaskByIds(Long[] ids)
    {
        return sysSpTaskMapper.deleteSysSpTaskByIds(ids);
    }

    /**
     * 删除审批任务信息
     * 
     * @param id 审批任务主键
     * @return 结果
     */
    @Override
    public int deleteSysSpTaskById(Long id)
    {
        return sysSpTaskMapper.deleteSysSpTaskById(id);
    }
    @Override
    public String imporIteminfo(List<SysSpTask> sysSpTaskList, boolean updateSupport, String operName) {
        if (StringUtils.isNull(sysSpTaskList) || sysSpTaskList.size() == 0)
        {
            throw new ServiceException("导入数据不能为空！");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (SysSpTask sysSpTask : sysSpTaskList)
        {
            try
            {
                BeanValidators.validateWithException(validator, sysSpTask);
                sysSpTask.setCreateBy(operName);
                sysSpTask.setUpdateBy(operName);
                this.insertSysSpTask(sysSpTask);
                successNum++;
                successMsg.append("<br/>" + successNum + "数据导入成功");
            }
            catch (Exception e)
            {
                failureNum++;
                String msg = "<br/> 数据导入失败：";
                failureMsg.append(msg + e.getMessage());
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
        }
        return successMsg.toString();
    }
}
